package util;

import java.util.Random;

public class RandomGen {
    //将总和为L的总数拆分成n份
    public static int[] randomSpliting(int n, int L){
        Random rand = new Random();
        int temp = L;
        int[] returnArray = new int[n];

        for(int i = 0, j; i < n-1; i++){ //拆分成n-1个，最后一个单独赋值（剩下的）
            do{ //判定条件，是为了保证剩下的数，足够剩下的n分配
                j = rand.nextInt(temp - 1) + 1;

            } while (temp-j < n - i);

            temp -= j;
            returnArray[i] = j;
        }
        returnArray[n-1] = temp; //一共n份，最后一份单独赋值
        return returnArray;
    }

    //将总和为L的总数拆分成n份，并设置上限
    public static int[] randomSpliting(int n, int L,int max){
        Random rand = new Random();
        int temp = L;
        int[] returnArray = new int[n];

        for(int i = 0, j; i < n-1; i++){ //拆分成n-1个，最后一个单独赋值（剩下的）
            do{ //判定条件，是为了保证剩下的数，足够剩下的n分配
                j = rand.nextInt(temp - 1) + 1;

            } while (temp-j < n - i || j>max);

            temp -= j;
            returnArray[i] = j;
        }
        returnArray[n-1] = temp; //一共n份，最后一份单独赋值
        return returnArray;
    }


    //产生n个随机不重复的数，min/max范围内(左闭右开，左边0的时候则是开)
    public static int[] randomCommon(int min, int max, int n){
        if (n > (max - min + 1) || max < min) {
            return null;
        }
        int[] result = new int[n];
        int count = 0;
        while(count < n) {
            int num = (int) (Math.random() * (max - min)) + min;
            boolean flag = true;
            for (int j = 0; j < n; j++) {
                if(num == result[j]){
                    flag = false;
                    break;
                }
            }
            if(flag){
                result[count] = num;
                count++;
            }
        }
        return result;
    }

    //产生n个等分的数，min/max范围内(左闭右开，左边0的时候则是开)
    public static int[] equalCommon(int min, int max, int n){
        if (n > (max - min + 1) || max < min) {
            return null;
        }
        int[] result = new int[n];
        int average = (max - min)/n;

        for (int i = 0; i < n; i++) {
            result[i] = min + average*(i+1);
        }
        return result;
    }
}
